# Python的设计哲学：一个问题只提供一种解决方案

# 备注
# PEP8是 Python里一套编程规范（即软性要求）
# Python中只有字符串类型，没有字符类型！'a'看作长度为 1的字符串
# 正是因为 Python没有字符类型，所以'和"都能用来表示字符串
# Python里的 None类似于空指针，表示什么都没有
# 快捷键：注释快捷键 Ctrl + / (\是反斜杠)，撤回快捷键 Ctrl + z

# 数据类型
# 数字（数值）类型
# (1)整数(integer)
# 十进制整数：0，-1，10
# 二进制整数：0b101，0B0111
# 八进制整数：0o0174，0O1432
# 十六进制整数：0x193f，0X83B9
# (2)浮点数(float)：
# 十进制形式：-0.102，0.3497
# 指数形式：124e-2(1.24),35.5e-3(0.0355),32E2(3200.0)
# (3)复数(complex)：
# 12.3+5j,34e-3+9J
# x = 39.3E-3+2j
# r = x.real #取实部
# i = x.imag #取虚部
# print(r, i)
# (4)布尔类型(bool) # 一种逻辑类型
# print(5 > 2) # 返回Ture
# print(5 < 2) # 返回False
# (5)字符串类型(string)
# 创建字符串
# single_line = "一行"
# print(single_line)
# multi_line = '''第一行
# 第二行
# 第三行'''
# print(multi_line)
#
# # 索引
# s = 'Python'
# print(s[0])
# print(s[-1])
# s = "Hello, World! Hello, Python!"
# index = s.index("Hello")
# print(index)
# try:
#     index = s.index("Hi")
#     print(index)
# except ValueError as e: #此处将异常信息赋值给变量 e
#     print(f"未找到子字符串 'Hi'，异常信息: {e}")
#
# # 切片
# s = 'Python'
# print(s[1:4])
# print(s[::2])
# print(s[::-1])
#
# # 拼接
# s1 = 'Hello'
# s2 = 'World'
# s3 = s1 + ', ' + s2
# print(s3)
# parts = ['Hello', 'World']
# s4 = ', '.join(parts)
# print(s4)
#
# # 重复
# s = '>'
# repeated_s = s * 3
# print(repeated_s)
#
# # 查找
# s = "Hello, World! Hello, Python!"
# index = s.find("Hello")
# print(index)  # 此处返回 0（索引从 0 开始计数）
# index = s.find("Hello", 7, 20)
# print(index) #
# index = s.find("Hello", 7, 11)
# print(index) #在查找范围内不存在返回-1
# index = s.find('Hi')
# print(index) #在字符串中不存在返回-1
# index = s.rfind("Hello") #rfind()方法，从后往前查找
# print(index)
#
# # 大小写转换
# txt = " Hello, world! Hello, python! "
# new_txt1 = txt.upper()
# new_txt2 = txt.lower()
# new_txt3 = txt.capitalize() #字符串首字母大写
# new_txt4 = txt.title() #字符串内所有单词首字母大写
# print(new_txt1)
# print(new_txt2)
# print(new_txt3)
# print(new_txt4)
#
# # 去除空白字符
# new_txt5 = txt.strip() #默认去除字符串两端的空白字符（包括空格、制表符、换行符等）
# new_txt6 = txt.lstrip() #去掉字符串左边的空白字符
# new_txt7 = txt.rstrip() #去掉字符串右边的空白字符
# new_txt8 = txt.strip("!") #去掉字符串左右的"!"
# print(new_txt5)
# print(new_txt6)
# print(new_txt7)
# print(new_txt8)
#
# # 分割（split()方法返回列表）
# new_txt9 = txt.split() # 分割依据默认为空格
# new_txt10 = txt.split(sep=",")
# new_txt11 = txt.count(",")
# print(new_txt9)
# print(new_txt10)
# print(new_txt11)
#
# # 替换
# new_txt12 = txt.replace("Hello","Hi") #默认会替换所有
# new_txt13 = txt.replace("Hello","Hi",1)
# print(new_txt12)
# print(new_txt13)
#
# # 格式化输出
# new_txt14 = txt.center(40,"-") # 填充字符fillchar默认是空格
# print(new_txt14)

# 转义字符
# \ 续行符
# num = 1 + 2 + 3 + \
#       4 + 5 + 6
# # \n 换行符
# print("第一行\n第二行")
# # \' 单引号
# print('他说：\'你好！\'')
# # \" 双引号
# print("她说：\"再见！\"")
# # \\ 反斜杠
# print("C:\\Program Files")
# # \t 水平制表符  \v 垂直制表符
# print('姓名\t年龄\t城市')
# print('Alice\t25\tNew York')
# print('Bob  \t30\tLos Angeles')
# \0 空字符  \000 同样表示空字符，它是八进制转义序列的一种写法
# print("abc\0def")
# print("abc\000def")
# \0yy \yyy \xyy
# x1 = "\060" #八进制
# x2 = "\123" #八进制
# x3 = "\x32" #十六进制
# print(x1, x2, x3)
# \r 回车符（将光标移回到当前行的开头）
# import time
# for i in range(10):
#     print(f'\r加载进度: {i * 10}%', end='')
#     # 每次循环时，\r 将光标移回行首，然后新的内容会覆盖原来的内容，从而实现类似进度条更新的效果
#     time.sleep(0.5)
#     # time.sleep() 是 Python 中 time 模块提供的一个函数，用于暂停当前线程的执行，暂停的时间以秒为单位
# \a 响铃

# # 格式化输出
# f-string 此处 f表示 format,和{}一起用(大括号里的是变量)
# a=10
# print(f"a=+{a}")
# print(f"a=+{a+10}")

# # 输入函数
# num = input('请输入一个数字：') # input返回值为字符串类型
# print(f'您输入的数字是：{num}')

# # 类型转换
# a = input('请输入第一个整数:')
# b = input('请输入第二个整数:')
# a = int(a) #转换数据类型：str -> int
# b = int(b)
# # print(f'a + b = {a + b}')

# # 算术运算符
# # **表示乘方运算，既能乘方也能开方
# print(4 ** 2)
# print(4 ** 0.5)
# # //表示地板除法(取整除法)，向下取整
# print(7 // 2)
# print(-7 // 2)

# # 关系运算符
# a = 10
# b = 20
# # 字符串按字典序比较先后顺序，字符串在词典中越靠前则越小
# #  中文进行字符串比较无意义
# a = 'hello'
# b = 'world'
# print(a > b)
# print(a < b)
# print(a >= b)
# print(a >= b)
# print(a == b)
# print(a != b)
# # 浮点数用==比较相等会误判
# print(0.1 + 0.2 == 0.3) #返回 False
# # 正确比较浮点数是否相等的方法是作差，看差值是否小于预期的误差范围(站在工程的角度误差极小视为相等)
# a = 0.1
# b = 0.2
# print(- 0.000001 < (a - b) < 0.000001) #Python支持连续小于的写法

# # 逻辑运算符
# a = 10
# b = 20
# c = 30
# print(a < b < c) # a < b < c 等价于 a < b and b < c
# print(a < b and b > c) # 一假则假
# print(a < b or b < c) # 一真则真
# print(a < b or b > c)
# print(a > b or b > c)
# print(not a < b) # 逻辑取反
# print(not a > b)
# #短路求值
# print(a > b and 1 + 1) # 对于 and 操作符，左侧为假，整体为假，右侧忽略
# print(a < b or 1 + 1) # 对于 or 操作符，左侧为真，整体为真，右侧忽略

# # 赋值运算符
# # 链式赋值 (不建议使用，因为一行代码一般只执行一个操作)
# a = b = 10  # 表示先把 10赋给b,再把b的值赋给a
# # 多元赋值 (可以用于数值交换)
# a, b = 10, 20
# a, b = b, a
# tmp = a # 数值交换的一般写法
# a = b
# b = tmp
# -=, +=, *=, /=, **=, //=
# a=10
# ++a #a前的+视为正号，-视为负号。Python不支持a++,a--这样的自增自减操作



# 字符串操作实例
# 实例1:单词逆序
# def reverse_words(s: str):
#     parts = s.split(' ')
#     parts.reverse()
#     return ' '.join(parts)
#
#
# print(reverse_words('I am a student.'))
# 实例2：判断旋转字符串
# def rotate_string(s, goal):
#     if len(s) != len(goal):
#         return False
#     return goal in (s + s)
#
#
# print(rotate_string('abcde', 'cdeab')) # Ture
# print(rotate_string('abcde', 'edcba')) # False
#
# 实例3：计前缀（prefix）个数
# def count_prefixes(words: list, s: str):
#     count = 0
#     for word in words:
#         if s.startswith(word): # startswith是判断前缀的方法,endswith是判断后缀的方法
#             count += 1
#     return count
#
#
# print(count_prefixes(['a', 'b', 'c', 'ab', 'bc', 'abc'], 'abc'))